#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <random>

using namespace std;

void BubbleSort(int *T, const int ROZMIAR, double *czas)
{
	clock_t t1, t2; 

	t1 = clock();

	int pom;

	for (int nr = 1; nr < ROZMIAR; nr++)
	{
		for (int i = 0; i < (ROZMIAR - nr); i++)
		{
			if (*(T+i) > *(T+i+1))
			{
				pom = *(T + i);
				*(T + i) = *(T + i + 1);
				*(T + i + 1) = pom;
			}

		}
	}

	t2 = clock();

	*czas = (((double)t2 - (double)t1) / CLOCKS_PER_SEC);

}

void BubbleSortFlag(int *T, const int ROZMIAR, double *czas)
{
	clock_t t1, t2;

	t1 = clock();

	int nr = 0;
	int pom = 0;
	bool znacznik = 0;

	do
	{
		znacznik = 0;

		for (int i = 0; i < (ROZMIAR - nr - 1); i++)
		{
			if (*(T + i) > *(T + i + 1))
			{
				pom = *(T + i);
				*(T + i) = *(T + i + 1);
				*(T + i + 1) = pom;
				znacznik = 1;
			}

		}

	} while (znacznik);

	t2 = clock();

	*czas = (((double)t2 - (double)t1) / CLOCKS_PER_SEC);

}

void SelectionSort(int *t, const int ROZMIAR, double *czas)
{
	clock_t t1, t2;

	t1 = clock();

	for (int i = 0, k = 0 ; i<ROZMIAR; i++)
	{
		for (int j = i + 1; j<ROZMIAR; j++)
			if (*(t+j)<(*(t+k)))
				k = j;
			swap(*(t + k), *(t + i));
	}

	t2 = clock();

	*czas = (((double)t2 - (double)t1) / CLOCKS_PER_SEC);

}

void InsertSort(int *T, const int ROZMIAR, double *czas)
{
	clock_t t1, t2;

	t1 = clock();

	int pom;

	for (int nr = 1; nr < ROZMIAR; nr++)
	{
		pom = T[nr];
		int i = nr - 1;
		while(pom < T[i])
		{
			T[i + 1] = T[i];
			i--;
		}
		T[i + 1] = pom;
	}

	t2 = clock();

	*czas = (((double)t2 - (double)t1) / CLOCKS_PER_SEC);

}

void Kopiuj(int *T1, int *T2, int R)
{
	for (int i = 0; i < R; i++)
		*(T2 + i) = *(T1 + i);
}

void wypelnijKolejno(int *tablica, const int ROZMIAR)
{
	clock_t t1, t2;

	t1 = clock();
	for (int i = 0; i < ROZMIAR; ++i)
	{
		*(tablica + i) = (i + 1);
	}
	t2 = clock() - t1;

	//cout << "czas wypelniania : ";
	//printf("%f", t2);
	//cout << endl;
}

void wypelnijOdwrotnie(int *tablica, const int ROZMIAR)
{
	for (int i = 0; i < ROZMIAR; ++i)
	{
		*(tablica + i) = (ROZMIAR-i);
	}
}

void wypelnijLosowo(int *tablica, const int ROZMIAR)
{
	for (int i = 0; i < ROZMIAR; ++i)
	{
		*(tablica + i) = rand();
	}
}

void rysujTablice(int *tablica, const int ROZMIAR)
{
	for (int i = 0; i < ROZMIAR; ++i)
	{
		cout << *(tablica + i) << "\t";
	}
	cout << "_________________________________________________\n";
}

int main()
{
	srand(time(NULL));

	double czas = NULL;
	const int WIELKOSC_TABLICY = 250000;

	int sortowanaTablica[WIELKOSC_TABLICY] = { 0 };

	//*****************Wypelnienie tablicy
	wypelnijKolejno(sortowanaTablica, WIELKOSC_TABLICY);
	//wypelnijOdwrotnie(sortowanaTablica, WIELKOSC_TABLICY);
	//wypelnijLosowo(sortowanaTablica, WIELKOSC_TABLICY);
	
	
	/*cout << "\nwypelniona: " << endl;
	rysujTablice(sortowanaTablica, WIELKOSC_TABLICY);*/
	

	//*****************Sortowanie tablicy
	//BubbleSort(sortowanaTablica, WIELKOSC_TABLICY, &czas);
	//InsertSort(sortowanaTablica, WIELKOSC_TABLICY, &czas);
	//SelectionSort(sortowanaTablica, WIELKOSC_TABLICY, &czas);
	BubbleSortFlag(sortowanaTablica, WIELKOSC_TABLICY, &czas);

	/*cout << "\ntablica: " << endl;
	rysujTablice(sortowanaTablica, WIELKOSC_TABLICY);*/


	cout << "czas sortowania : ";
	printf("%f", czas);

	_CrtDumpMemoryLeaks();

	system("PAUSE");
	return 0;
}
